//
//  HMHomeViewController.swift
//  WeiBo
//
//  Created by apple on 16/6/23.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit
import AFNetworking
import SVProgressHUD

let HMHomeViewControllerCellReuseIdentifier = "HMHomeViewControllerCellReuseIdentifier"

class HMHomeViewController: HMBaseTableViewController {


    
    override func viewDidLoad() {
        super.viewDidLoad()

        // 类型.self -> 指定类
//        tableView.registerClass(HMHomeTableViewCell.self, forCellReuseIdentifier: HMHomeViewControllerCellReuseIdentifier)
        
        // Do any additional setup after loading the view.
        if isLogin {
        
            // 登录之后才可以获取数据
            loadData()
            // 注册cell
            // 类型.self -> 指定类
            tableView.registerClass(HMHomeTableViewCell.self, forCellReuseIdentifier: HMHomeViewControllerCellReuseIdentifier)
        
            // 设置一下cell的高度,先给他一个固定的高度
            // 第一个设置自动计算行高
            tableView.rowHeight = UITableViewAutomaticDimension
            // 第二个设置预估行高
            tableView.estimatedRowHeight = 200
            // 第三个注意事项: 自动计算行高的原理
            
            // tableView的footerView上
            tableView.tableFooterView = loadingView
            
            //  菊花需要手动转动
//            loadingView.startAnimating()
            
            // iOS 6.0 之后,UITableView系统增加了自己的下拉刷新
            /*
                0. UIControl
                1. UIRefreshControl 系统有默认的宽和高
                2. 触发的方法是 ValueChanged
            */
//            refreshControl = UIRefreshControl()
//            // 出来之后刷新数据
//            refreshControl?.addTarget(self , action: "loadData", forControlEvents: .ValueChanged)
            
            tableView.addSubview(refreshView)
            
            refreshView.addTarget(self, action: "loadData", forControlEvents: .ValueChanged)
//            tableView.contentOffset
            // 添加KVO的第一步,addObserver这个方法
            /*
                1.观察者 -- 观察者需要实现,观察方法
                2.keyPath -- 属性
                3.属性的变化
                4.
            */
//            tableView.addObserver(self, forKeyPath: "contentOffset", options: .New, context: nil)
            
            
            // 注册通知
            NSNotificationCenter.defaultCenter().addObserver(self, selector: "showPhotoBrower:", name: kNotificationPhotoBrower, object: nil)
            
            
        } else {
            
            visitorView.setupInfo(true, image: "visitordiscover_feed_image_house", messaeg: "关注一些人，回这里看看有什么惊喜")
            
        }
        
    }

    //MARK:-- 实现通知方法
    @objc private func showPhotoBrower(noti: NSNotification){
        
        // 分析一下可选项, userinfo肯定有值,所以我们可以强制解包
       if let pic_urls = noti.userInfo!["picurls"] as? [HMPhotoViewModel],indexPath = noti.userInfo!["indexPath"] as? NSIndexPath {
            
            let brower = HMPhotoBrowerViewController(pic_urls: pic_urls, indexPath: indexPath)
        
            presentViewController(brower, animated: true, completion: { () -> Void in
                
            })
            
        }
        
    }
    
    
    deinit{
        
        // 移除通知
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    
    // MARK:-- 懒加载
/// 加载更多是视图 -- 一个菊花
    private lazy var loadingView: UIActivityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.Gray)
    
    private lazy var refreshView: HMRefreshView = HMRefreshView()
}

//MARK:-- 获取首页数据
extension HMHomeViewController{
    
    func loadData(){
        // 数据加载的时候,来一个提示
//        SVProgressHUD.show()
        
        showLoadingView()
        
        // since_id	false	int64	若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0。
        // max_id	false	int64	若指定此参数，则返回ID小于或等于max_id的微博，默认为0。
        
        var since_id = 0
        var max_id = 0
        
        // 下拉刷新的 since_id 赋值
        since_id = HMStatusListViewModel.shareInstance.statusList.first?.model?.id ?? 0
        
        // 加载更多的时候,修改max_id
        // 刚开始程序运行的时候,这个方法不走,因为 菊花还没有转动
        if loadingView.isAnimating() {
            
            max_id = HMStatusListViewModel.shareInstance.statusList.last?.model?.id ?? 0
            if max_id != 0 {
                // 由于返回ID小于或等于max_id的微博,所以我们需要把id - 1,防止再次返回这个微博
                max_id = max_id - 1
            }
            
            // 让since_id 归0
            since_id = 0
            
        }
        
        
        // sinceid 和 max_id 都有值的时候,不会返回数据
        
        // 实现上拉更多
        
        HMStatusListViewModel.shareInstance.loadData(since_id, max_id: max_id, success:{ (count) -> () in
            
            self.tableView.reloadData()
            
            // 当没有加载更多的时候,出现更新提示
            if !self.loadingView.isAnimating() {
                // 提示视图
                self.showMessage(count)
            }
            
            // 数据加载完成之后,让菊花停止
            self.loadingView.stopAnimating()
            
            // 数据加载完成之后,调用一下系统的完成刷新方法
//            self.refreshControl?.endRefreshing()
            // 数据加载完成之后,调用自定义的完成刷新方法
            self.refreshView.endRefreshing()
//            SVProgressHUD.dismiss()
            self.hiddenLoadingView()
            
           
            
            }) { () -> () in
                
                // 提示失败信息
                
                self.hiddenLoadingView()
//                SVProgressHUD.showErrorWithStatus("网络加载失败,请稍后再试")
        }
    }
    
    //MARK:-- 提示视图
    private func showMessage(count: Int){
        
        let labelHeight: CGFloat = 44
        
        let label = UILabel(frame: CGRectMake(0, 64 -  labelHeight, kUIScreenWidth, labelHeight))
        
        label.backgroundColor = UIColor.orangeColor()
        
        if count == 0 {
            label.text = "暂时没有更新微博"
        } else{
            
            label.text = "更新了\(count)条微博"
        }
        
        label.textAlignment = .Center
        
        // 添加视图 -- 存在一个bug,会随着tableVIew的滚动而滚动
//        self.view.addSubview(label)
        // 针对视图层次结构一定要分析出来
        navigationController?.view.insertSubview(label, belowSubview: navigationController!.navigationBar)
        
        // 接下来实现一下动画效果
        UIView.animateWithDuration(1.0, animations: { () -> Void in
            
            label.transform = CGAffineTransformMakeTranslation(0, labelHeight)
            
            }) { (_) -> Void in
                //动画完成的时候,再回去
                
                UIView.animateWithDuration(1.0, animations: { () -> Void in
                    label.transform = CGAffineTransformIdentity
                    }, completion: { (_) -> Void in
                        // 动画回去之后的回调
                        label.removeFromSuperview()
                })
                
        }
    }
    
}

// MARK:-- UITableView的数据源方法
extension HMHomeViewController{
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return HMStatusListViewModel.shareInstance.statusList.count
        
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 看到 ReusableCellWithIdentifier 就条件反射的想到注册cell
        let cell = tableView.dequeueReusableCellWithIdentifier(HMHomeViewControllerCellReuseIdentifier, forIndexPath: indexPath) as! HMHomeTableViewCell
        
        // 先获取model -- List 里应该存放的也是 HMStatusCellViewModel
        let model = HMStatusListViewModel.shareInstance.statusList[indexPath.row]
//        print(model.user?.id)
//        cell.textLabel?.text = model.user?.screen_name //model.text
        
        cell.model = model
        
        printLog(model.model?.id)
        
        // 应该让用户滑动倒数几个的时候去加载数据
        // 倒数第二个的时候,去加载数据
        if indexPath.item == (HMStatusListViewModel.shareInstance.statusList.count - 1) {
            
            // 让菊花转动
            loadingView.startAnimating()
            
            loadData()
        }
        
        
        return cell
        
    }
    
}

/*

   @objc private
    在按钮/监听事件 等运行时的一些交互的时候,需要调用 @objc
    我们的代码,认为调用的 private 不需要添加@objc

*/
